/**
 * 第13章 Java安全
 * 代码清单-p3ch13a-407页a：Principal接口实现类的示例 {@link top.kaoshanji.p3ch13a.UserPrincipal}
 * 代码清单-p3ch13a-410页a：CallbackHandler接口的实现类的示例 {@link top.kaoshanji.p3ch13a.TextCallbackHandler}
 * 代码清单-p3ch13a-412页a：基于属性文件的登录模型的实现 {@link top.kaoshanji.p3ch13a.PropertiesFileBasedLoginModule}
 * 代码清单-p3ch13a-01-415页a：完整的登录过程的示例 {@link top.kaoshanji.p3ch13a.MyApp}
 * 代码清单-p3ch13a-02-417页a：p3ch13a02/system_property.policy
 * 代码清单-p3ch13a-419页a：使用 SecurityManager 类进行权限检查 {@link top.kaoshanji.p3ch13a.WriteFile#writeFile2(java.nio.file.Path, byte[])}
 * 代码清单-p3ch13a-419页b：使用 AccessController 类进行权限检查 {@link top.kaoshanji.p3ch13a.WriteFile#writeFile(java.nio.file.Path, byte[])}
 * 代码清单-p3ch13a-420页a：获取系统属性的方法示例 {@link top.kaoshanji.p3ch13a.GetSystemProperty#get(java.lang.String)}
 * 代码清单-p3ch13a-421页a：使用特权动作获取系统属性 {@link top.kaoshanji.p3ch13a.GetSystemProperty#getWithPrivilege(java.lang.String)}
 * 代码清单-p3ch13a-421页b：使用特权动作写入文件的示例 {@link top.kaoshanji.p3ch13a.WriteFile#writeFileWithPrivilege(java.nio.file.Path, byte[])}
 * 代码清单-p3ch13a-422页a：Subject类的doAsPrivileged方法的使用示例 {@link top.kaoshanji.p3ch13a.SubjectDoAs}
 * 代码清单-p3ch13a-423页b：GuardedObject类和Guard接口的使用示例 {@link top.kaoshanji.p3ch13a.UseGuard}
 * 代码清单-p3ch13a-425页a：Provider类的使用示例 {@link top.kaoshanji.p3ch13a.ListProviders}
 * 代码清单-p3ch13a-426页a：对称加密和解密操作的示例 {@link top.kaoshanji.p3ch13a.SymmetricEncryption}
 * 代码清单-p3ch13a-427页a：使用加密方式保存对象序列化之后的内容 {@link top.kaoshanji.p3ch13a.StoreObject}
 * 代码清单-p3ch13a-428页a：使用MD5算法计算摘要的示例 {@link top.kaoshanji.p3ch13a.MessageDigestUsage}
 * 代码清单-p3ch13a-428页b：计算消息验证码的示例 {@link top.kaoshanji.p3ch13a.MessageDigestUsage}
 * 代码清单-p3ch13a-429页a：数字签名的使用示例 {@link top.kaoshanji.p3ch13a.DigitalSignature}
 * 代码清单-p3ch13a-430页a：使用SignedObject类来安全保存对象的示例 {@link top.kaoshanji.p3ch13a.SaveObject}
 * author kaoshanji
 * ^_^
 * create time 2025/2/6 20:19
 */
package top.kaoshanji.p3ch13a;